home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2004 May / SGI IRIX 6.5 Applications 2004 May.iso / dist / java3d.idb / usr / demos / java / j3d / programs / examples / VirtualInputDevice / ButtonPositionControls.java.z / ButtonPositionControls.java
Encoding:
Java Source  |  2003-08-08  |  7.1 KB  |  203 lines

  1. /*
  2.  *    @(#)ButtonPositionControls.java 1.19 02/04/01 15:03:55
  3.  *
  4.  * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in
  15.  *   the documentation and/or other materials provided with the
  16.  *   distribution.
  17.  *
  18.  * Neither the name of Sun Microsystems, Inc. or the names of
  19.  * contributors may be used to endorse or promote products derived
  20.  * from this software without specific prior written permission.
  21.  *
  22.  * This software is provided "AS IS," without a warranty of any
  23.  * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
  24.  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
  25.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
  26.  * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
  27.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  28.  * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
  29.  * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  30.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
  31.  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
  32.  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
  33.  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  34.  *
  35.  * You acknowledge that Software is not designed,licensed or intended
  36.  * for use in the design, construction, operation or maintenance of
  37.  * any nuclear facility.
  38.  */
  39.  
  40. import java.awt.*;
  41. import java.awt.event.*;
  42. import javax.vecmath.*;
  43. import javax.media.j3d.*;
  44.  
  45. public class ButtonPositionControls extends Panel implements PositionControls, MouseListener {
  46.     private final static int STILL=0;
  47.     private final static int MOVING_UP=1;
  48.     private final static int MOVING_DOWN=2;
  49.     private final static int MOVING_LEFT=3;
  50.     private final static int MOVING_RIGHT=4;
  51.     private final static int MOVING_FORWARD=5;
  52.     private final static int MOVING_BACK=6;
  53.  
  54.     // initial mode
  55.     private int mode = STILL;
  56.  
  57.     Vector3f position = new Vector3f();
  58.     Vector3f orig_position = new Vector3f();
  59.  
  60.     private Button leftB = new Button("Move Left");
  61.     private Button rightB = new Button("Move Right");
  62.     private Button upB = new Button("Move Up");
  63.     private Button downB = new Button("Move Down");
  64.  
  65.     private Button forwardB = new Button("Move Forward");
  66.     private Button backwardB = new Button("Move Back");
  67.  
  68.     private Button reset = new Button("Reset");
  69.     private InputDevice device;
  70.  
  71.     private float step_rate = 0.0023f;   // movement rate per millisecond
  72.     private long time_last_state_change = System.currentTimeMillis();
  73.  
  74.     // the constructor arguments are the intitial X, Y, and Z positions
  75.     public ButtonPositionControls( float x, float y, float z ) {
  76.  
  77.         // up, down, right, and left movement buttons
  78.         Panel panPanel = new Panel();
  79.         panPanel.setLayout( new BorderLayout() );
  80.         panPanel.add("North", upB);
  81.         panPanel.add("East", rightB);
  82.         panPanel.add("South", downB);
  83.         panPanel.add("West", leftB);
  84.  
  85.         // forward, backward, and reset buttons 
  86.         Panel p = new Panel();
  87.         p.setLayout( new GridLayout(0,1,0,0) );
  88.         p.add(forwardB);
  89.         p.add(backwardB);
  90.         p.add(reset);
  91.  
  92.         // set the initial position
  93.         position.x = x;
  94.         position.y = y;
  95.         position.z = z;
  96.         orig_position.set(position);
  97.  
  98.         // add a mouse listener to each button
  99.         upB.addMouseListener(this);
  100.         downB.addMouseListener(this);
  101.         leftB.addMouseListener(this);
  102.         rightB.addMouseListener(this);
  103.         forwardB.addMouseListener(this);
  104.         backwardB.addMouseListener(this);
  105.         reset.addMouseListener(this);
  106.  
  107.     this.setLayout( new BorderLayout() );
  108.         add("East", p );
  109.     add("West", panPanel );
  110.     }
  111.  
  112.     public void setDevice ( InputDevice device) {
  113.         this.device = device;
  114.     }
  115.  
  116.     public void getPosition(Vector3f pos ) {
  117.     calculateMotion();
  118.     pos.set(position);
  119.     }
  120.  
  121.     public void setPosition(Vector3f pos ) {
  122.     position.set(pos);
  123.     }
  124.  
  125.     public void setStepRate( float stepRate ) {
  126.     step_rate = stepRate;
  127.     }
  128.  
  129.     private void calculateMotion() {
  130.  
  131.         long current_time = System.currentTimeMillis();
  132.         long elapsed_time = current_time - time_last_state_change;
  133.  
  134.         switch(mode) {
  135.             case STILL:
  136.                 break;
  137.             case MOVING_LEFT:
  138.                 position.x = orig_position.x - step_rate*elapsed_time;
  139.                 break;
  140.             case MOVING_RIGHT:
  141.                 position.x = orig_position.x + step_rate*elapsed_time;
  142.                 break;
  143.             case MOVING_UP:
  144.                 position.y = orig_position.y + step_rate*elapsed_time;
  145.                 break;
  146.             case MOVING_DOWN:
  147.                 position.y = orig_position.y - step_rate*elapsed_time;
  148.                 break;
  149.             case MOVING_FORWARD:
  150.                 position.z = orig_position.z - step_rate*elapsed_time;
  151.                 break;
  152.             case MOVING_BACK:
  153.                 position.z = orig_position.z + step_rate*elapsed_time;
  154.                 break;
  155.             default:
  156.                 throw( new RuntimeException("Unknown motion"));
  157.         }
  158.     }
  159.  
  160.     public void mouseClicked( MouseEvent e ) {
  161.     }
  162.  
  163.     public void mouseEntered( MouseEvent e ) {
  164.     }
  165.  
  166.     public void mouseExited( MouseEvent e ) {
  167.     }
  168.  
  169.     public void mousePressed( MouseEvent e ) {
  170.         if (e.getSource()==leftB && mode != MOVING_LEFT) {
  171.               time_last_state_change =  System.currentTimeMillis();
  172.               mode = MOVING_LEFT;
  173.               orig_position.set(position);
  174.         } else if (e.getSource()==rightB && mode != MOVING_RIGHT) {
  175.               time_last_state_change =  System.currentTimeMillis();
  176.               mode = MOVING_RIGHT;
  177.               orig_position.set(position);
  178.         } else if (e.getSource()==upB && mode != MOVING_UP) {
  179.               time_last_state_change =  System.currentTimeMillis();
  180.               mode = MOVING_UP;
  181.               orig_position.set(position);
  182.         } else if (e.getSource()==downB && mode != MOVING_DOWN) {
  183.               time_last_state_change =  System.currentTimeMillis();
  184.               mode = MOVING_DOWN;
  185.               orig_position.set(position);
  186.         } else if (e.getSource()==forwardB && mode != MOVING_FORWARD) {
  187.               time_last_state_change =  System.currentTimeMillis();
  188.               mode = MOVING_FORWARD;
  189.               orig_position.set(position);
  190.         } else if (e.getSource()==backwardB && mode != MOVING_BACK) {
  191.               time_last_state_change =  System.currentTimeMillis();
  192.               mode = MOVING_BACK;
  193.               orig_position.set(position);
  194.         } else if (e.getSource()==reset) {
  195.               device.setNominalPositionAndOrientation();
  196.         }
  197.     }
  198.  
  199.     public void mouseReleased( MouseEvent e ) {
  200.         mode = STILL;
  201.     }
  202. }
  203.